package jwts

import (
	"errors"
	"github.com/golang-jwt/jwt/v5"
	"product/common/validator"
)

// JwtHollyClaims jwt自定义声明
type JwtHollyClaims struct {
	ID   int64
	Name string
	jwt.RegisteredClaims
}

func NewJwtHollyClaims(id int64, name string) *JwtHollyClaims {
	return &JwtHollyClaims{
		ID:   id,
		Name: name,
	}
}

// GetExpirationTime 获取过期时间
// 返回值：过期时间，错误
func (c *JwtHollyClaims) GetExpirationTime() (*jwt.NumericDate, error) {
	return c.ExpiresAt, nil
}

// GetNotBefore 获取生效时间
// 返回值：生效时间，错误
func (c *JwtHollyClaims) GetNotBefore() (*jwt.NumericDate, error) {
	return c.NotBefore, nil
}

// GetIssuedAt 获取签发时间
// 返回值：签发时间，错误
func (c *JwtHollyClaims) GetIssuedAt() (*jwt.NumericDate, error) {
	return c.IssuedAt, nil
}

// GetAudience 获取接收方
// 返回值：接收方，错误
func (c *JwtHollyClaims) GetAudience() (jwt.ClaimStrings, error) {
	return c.Audience, nil
}

// GetIssuer 获取签发人
// 返回值：签发人，错误
func (c *JwtHollyClaims) GetIssuer() (string, error) {
	return c.Issuer, nil
}

// GetSubject 获取主题
// 返回值：主题，错误
func (c *JwtHollyClaims) GetSubject() (string, error) {
	return c.Subject, nil
}

// GenToken 生成token
// 返回值：token，错误
func GenToken(claims *JwtHollyClaims, jwtKey string) (string, error) {
	if validator.IsEmptyString(jwtKey) {
		return "", errors.New("jwtKey不能为空")
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	return token.SignedString([]byte(jwtKey))
}

// ParseToken 解析token
// tokenStr token字符串
// jwtKey jwt密钥
// 返回值：claims，错误
func ParseToken(tokenStr, jwtKey string) (*JwtHollyClaims, error) {
	claims := &JwtHollyClaims{}
	token, err := jwt.ParseWithClaims(tokenStr, claims, func(token *jwt.Token) (interface{}, error) {
		return []byte(jwtKey), nil
	})
	if err != nil && !token.Valid {
		return nil, errors.New("token无效")
	}
	return claims, nil
}
